#设计模式
'''
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决
方案。这些解决方案是众多软件开发人员经过相当长的一段时间的
试验和错误总结出来的。

使用设计模式是为了可重复代码，让代码更容易被他人理解、保证
代码的可靠性。

'''
#单例---是一个特殊的列，这个类只能创建一次实例对象。
#单例模式：让所有类在实例化时，指向同一个内存地址
'''
让所有的类在实例化时，指向同一个内存地址，称之为单例模式。

特点：每一次执行类()返回的对象，内存地址是相同的

意义：节省内存空间，因为产生不同的对象，会产生不同内存地址
造成资源的浪费。


'''
#单例模式的运用
'''
1.应用程序的日志应用
2.线程池，数据库链接池等资源池一般也用单例模式
3.网站计数器，一般也是采用单例模式实现
4.单例模式在游戏中的运用十分广泛

'''
#单例模式实现的五种方法
'''
1.通过__new__()实现
2.通过@classmethod
3.通过装饰器实现
4.通过导入模块时实现
5.通过元类实现

'''
#设置单例模式的本质：
'''
1.判断这个实例是否存在；
2.如果存在，则返回这个实例，如果不存在则创建这个实例对象。
'''


#1.__new__()实现单例模式---指向同一个内存地址
'''
class Person:
    pass

a = Person()
b = Person()
print(id(a))    #1623059399680
print(id(b))    #1623059406112  内存地址不一致
'''
class Test(object):
    ins = None     #属性--用来保存实例对象的引用（类似变量赋值）
    def __new__(cls,*args,**kwargs):
        if cls.ins is None:
            cls.ins = super().__new__(cls)#创建实例对象调用父类__new__()
            #cls.ins = object.__new__(cls)这中方式也可以如上面一句的效果
            
            
        return cls.ins
t1 = Test()
t2 = Test()
#不同实例对象都指向同一个内存地址，现实单例模式，如下：
print(t1)    #<__main__.Test object at 0x00000202FF071DB0>
print(t2)    #<__main__.Test object at 0x00000202FF071DB0>


#思路：
'''
1.定义一个类属性，初始值是None，用于记录单例对象的引用；
2.重写__new__()方法：
3.如果类属性是None,调用父类分配空间，并在类属性中记录结果；
4.返回类属性中记录的对象引用。

'''


